/**
 *
 * 第一个错误的版本:https://leetcode-cn.com/problems/first-bad-version/
 *
 */

/**
 * Definition for isBadVersion()
 *
 * @param {integer} version number
 * @return {boolean} whether the version is bad
 * isBadVersion = function(version) {
 *     ...
 * };
 */

let isBadVersion = function (version) {
  return version >= 13
}

/**
 * @param {function} isBadVersion()
 * @return {function}
 */
var solution = function (isBadVersion) {
  /**
   * @param {integer} n Total versions
   * @return {integer} The first bad version
   */
  return function (n) {
    let l = 1
    let r = n
    let m,
      temp = r
    // l < r 为什么呢，因为 必定存在，所以当l === r时，就已经是答案了；而且如果l <=r ，此时会死循环，因为r无法小于 l
    while (l < r) {
      m = Math.floor(l + (r - l) / 2)
      if (isBadVersion(m)) {
        if (temp > m) {
          temp = m
        }
        // 如果中心位置是错误版本，则取左半段，需要包含当前位置！！！不排除当前位置就是最早的
        r = m
      } else {
        // 如果中心位置不是错误版本，说明最开始的错误版本在右半部分
        l = m + 1
      }
    }
    return l
  }
}

let index = solution(isBadVersion)(100)
console.log(index)

//================v1要点总结===============
/**
 * 1. 注意题意：查找错误版本，且是最早的错误版本
 * 2. 当中心位置是错误版本时，说明最早的可能在左半段，那此时要不要包含中心位置呢？要的，不排除该位置就是最早的，所以不是r=m - 1，应该时r = m
 * 3. 循环结束条件应该时l < r 为什么呢，因为 必定存在，所以当l === r时，就已经是答案了
 */
